#ifndef PTSI_HPP_
	#define PTSI_HPP_

	#define PTSI_HEAD_SIZE			2
	#define PTSI_VIDEO_HEAD_SIZE	16

	#define PTSI_VIDEO_MSG			9

	enum cmd_ptsi_u
	{
		CONF_GEN	= 1
	};

		//!	@brief				Конструкор по умолчанию.
		/*!	@param				Нет
		 */
		alt_u8 ptsi_init(void);

		//!	@brief				Разбор сообщений
		/*!	@param 	msg			Указатель на начало сообщения
		 *  @return	cmd			Код команды
		 */
		alt_u8 ptsi_head_parser(alt_u8* msg);

		//!	@brief				Формирует по заданному адресу заголовки сообщения "Видеоданные"
		/*!	@param 	msg			Указатель на начало сообщения
		 *  @return	err			Код ошибки
		 */
		alt_u8 ptsi_create_head_video(alt_u8* msg, alt_u16 row_num, alt_u16 frame_num, alt_u32 addr);

		//!	@brief				Управление счетчиком запрошенных строк
		/*!	@param 				нет
		 *  @return	err			Код ошибки
		 */
		alt_u8 ptsi_row_ctrl(void);

		//!	@brief				Разбирет сообщение PtSi
		/*!	@param 				Указатель на начало сообщения
		 *  @return	err			Код ошибки
		 */
		alt_u8 ptsi_msg_parser(alt_u8* msg);


		alt_u16 ptsi_get_row_cnt(void);

		//! Структура заголовка Ethernet
		union	ptsi_header_u
		{
			struct __attribute__((packed, aligned(1)))
			{
				alt_u8		start;			//!< Стартовый символ
				alt_u8		cmd;			//!< Код команды
			};
			alt_u8			data[PTSI_HEAD_SIZE];
		};

		typedef struct __attribute__((packed, aligned(1))) sig_param_s
		{
			alt_u32		phase;					//!< Фаза
			alt_u32		period_imp;				//!< Период следования импульсов в группе
			alt_u32		res1;					//!< 0
			alt_u32		up_imp;					//!< Длительность импульса
			alt_u32		num_imp;				//!< Количество импульсов в группе
			alt_u32		sync_ch;				//!< Номер запускающего сигнала
			alt_u32		res2;					//!< 0
			alt_u32		period_group;			//!< Период всей группы
			alt_u32		phase_group;			//!< Фаза всей группы
			alt_u32		res3[8];				//!< 0
		}sig_param_t;

		union	conf_gen_u
		{
			struct
			{
				sig_param_t	vrdata;
				sig_param_t	vrsync;
				sig_param_t	vldata;
				sig_param_t	vlsync;
				sig_param_t	vhdata;
				sig_param_t	vhsync;
				sig_param_t	vsample;
				sig_param_t	vclamp;
				sig_param_t	adc_stb;
				sig_param_t	sof;
				sig_param_t	cdsclk1;
				sig_param_t	cdsclk2;
				sig_param_t	adcclk1;
				sig_param_t	res[3];
			};
			alt_u32 data[256];
		};

		union	video_head_u
		{
			struct __attribute__((packed, aligned(1)))
			{
				unsigned	heigth		:16;				//!< Высота растра
				unsigned	width		:16;				//!< Ширина растра
				unsigned	frame		:16;				//!< Номер видеокадра
				unsigned	row			:16;				//!< Номер текущей строки
				unsigned	addr		:32;				//!< Адрес буфера
				unsigned	res;							//!< Резерв
			};
			alt_u8 data[PTSI_VIDEO_HEAD_SIZE];
		};

		//! Тип, задающий заголовок
		typedef union ptsi_header_u 	ptsi_header_t;
		typedef	union conf_gen_u		conf_gen_t;
		typedef	union video_head_u	video_head_t;

#endif /*PTSI_HPP_ */
